// 多参函数 变成一个 : 拆解

// 只有 函数才能调用 call bind apply 
// 改变this指向

// 谁调用 this就指向谁
// es5的函数  es6的箭头函数不存在这个规律的 : this不存在this指向的 指向外层作用域
// function abc (){
//   console.log(this)
// }

const obj = {

  fn1 : ()=>{
    console.log(this)
  },

  fn2 : function(){
    console.log(this)
  },

  fn3 : function(){
    return function (){
      console.log(this)
    }
  },

  fn4 : ()=>{
    return function(){
      console.log(this)
    }
  },
  fn5(){
    const abc = ()=>{
      console.log(this)
    }
    abc()
  },
  fn6(){
    let self = this
    return ()=>{
      console.log(this === self)
    }
  }
}

// call apply : 参数不同
// call 的参数 多参
// apply 的参数 是一个数组

function abc (params){
  console.log(this,params)
  return 'abc'
}

function selfCall(target,...args){
  // console.log(this)
  const func = this;
  // func : abc这个函数
  // 改变func的this指向 : 改变当前函数的调用者
  // target['func'] = func // target : myThis
  // target['func'](...args)
  const caller = Symbol('caller');
  target[caller] = func;
  const res = target[caller](...args);
  delete target[caller];
  return res;
}

Function.prototype.selfCall = selfCall
let myThis = {a:12,b:24,'func':'abc'}
const result = abc.selfCall(myThis,123)
console.log(result)

// apply : bind